package com.parking.certified.service;

import com.parking.certified.client.form.CertifiedSelectStallNumForm;
import com.parking.certified.dto.*;
import com.parking.certified.entity.CertifiedInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.parking.certified.form.*;
import com.parking.common.core.model.PageInfo;

import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 彭于晏
 * @since 2023年11月29日
 */
public interface CertifiedInfoService extends IService<CertifiedInfo> {
    /***
     * 修改物业联系方式
     * @param form
     * @param certifiedAccountId
     */
    void updateCertified(UpdateCertifiedForm form,Integer certifiedAccountId);

    /***
     * 物业查询自己的信息
     * @param certifiedAccountId
     * @return
     * @throws Exception
     */
    CertifiedInfoDTO selectCertifiedInfoAccount(Integer certifiedAccountId)throws Exception;

    /***
     * 平台查询物业信息
     * @param form 分页
     * @return
     */
    PageInfo selectCertified(SelectCertifiedForm form,Integer platformId);

    /***
     * 用户查询物业信息
     * @param form
     * @return
     */
    CertifiedInfoDTO selectUser(SelectCertifiedForm form,Integer userId);
    /**
     * 车位模块的调用
     * @param certifiedAccountId:物业账号id
     * selectCertifiedInfo:物业信息查询
     * SelectCertifiedInfoDTO:物业信息查询返回对象
     * @return
     */
    SelectCertifiedInfoDTO selectCertifiedInfo(Integer certifiedAccountId);
    /***
     * 根据ID查询物业信息
     * 参数: 物业信息Id   certifiedInfoId
     * 返回: 物业名称     certifiedInfoName
     *      物业电话     certifiedInfoTel
     *      物业地址     certifiedInfoAddress
     *      普通车位单价  stallUnitPrice
     *      充电车位单价  chargeUnitPrice
     * 方法: 1.判断certifiedInfoId是否存在对应的物业账号 若不存在则抛异常
     *      3.将物业账号放入Dto返回
     */
    CertifiedInfoClientDto selectCertifiedInfoById(Integer certifiedInfoId);

    /**
     * 更新物业评分
     * 返回: List<CertifiedScoreDto> 物业评分Dto集合
     *      CertifiedScoreDto 物业评分Dto
     *          certifiedInfoId    物业信息Id
     *          certifiedInfoScore 物业评分
     * 方法: 给所有certifiedInfoId的物业信息赋分certifiedInfoScore
     *      1.查询certifiedInfoId对应的物业信息
     *      2.在Java层面修改物业评分certifiedInfoScore
     *      3.批量修改 (CertifiedInfoService业务层方法 saveOrUpdateBatch)
     * */
    void certifiedScoring(CertifiedScoreForm form);

    /***
     * 根据经纬度查询物业
     * @param form
     * @return
     */
    Set<DistanceCertifiedInfoDto> distanceCertifiedCall(SelectDistanceCertifiedInfoForm form);

    /***
     * 根据车辆类型查询物业信息
     * @param form
     * @return
     * @throws Exception
     */
    CertifiedInfoDTO distanceCertifiedStall(CertifiedSelectStallNumForm form)throws Exception;

    /***
     *
     * @param path
     * @param certifiedAccountId
     */
    void upLoad(String path, Integer certifiedAccountId);

    /***
     * 修改营业执照
     * @param form
     * @throws IOException
     */
    void upCertifiedInfoImg(UpdateCertifiedImgForm form) throws IOException;

    /***
     * 用户根据经纬度查询附近范围物业详细信息
     * @param form
     * @return
     * @throws Exception
     */
    List<CertifiedInfoDTO>selectCertifiedInfoForUser(SelectCertifiedInfoForUserForm form)throws Exception;

    /***
     * 物业修改车位价格
     * @param form
     * @param certifiedAccountId
     */
    void updateStallPrice(UpdateStallPriceForm form,Integer certifiedAccountId);


}
